/* global travelgoFlightSearch, travelgoUpgrades */ (function () { var cfg = typeof travelgoFlightSearch === "object" && travelgoFlightSearch ? travelgoFlightSearch : {}; var upg = typeof travelgoUpgrades === "object" && travelgoUpgrades ? travelgoUpgrades : {}; var features = upg.features || {}; var root = document.getElementById("travelgo-flight-results-root"); if (!root) return; function featureOn(k) { return Number(features[k] || 0) === 1; } function q(sel, ctx) { return (ctx || document).querySelector(sel); } function qa(sel, ctx) { return Array.prototype.slice.call((ctx || document).querySelectorAll(sel)); } function curStateFromUrl() { var p = new URLSearchParams(window.location.search); return { tf_from: p.get("tf_from") || "", tf_to: p.get("tf_to") || "", tf_dep: p.get("tf_dep") || "", tf_ret: p.get("tf_ret") || "", tf_cur: p.get("tf_cur") || "INR", tf_trip: p.get("tf_trip") || "round_trip" }; } function postJson(url, payload) { return fetch(url, { method: "POST", headers: { "Content-Type": "application/json", Accept: "application/json" }, credentials: "same-origin", body: JSON.stringify(payload || {}) }).then(function (r) { return r.json().catch(function () { return {}; }); }); } function track(name, payload) { if (!cfg.eventUrl) return; postJson(cfg.eventUrl, { name: name, payload: payload || curStateFromUrl() }); } var toolbar = q(".travelgo-fr-toolbar", root); if (toolbar) { var bar = document.createElement("div"); bar.className = "travelgo-upg-actions"; if (featureOn("saved_trips")) { bar.innerHTML += ''; } if (featureOn("fare_alerts")) { bar.innerHTML += ''; } if (featureOn("compare_drawer")) { bar.innerHTML += ''; } toolbar.parentNode.insertBefore(bar, toolbar.nextSibling); } if (featureOn("recent_searches") && cfg.searchHistoryUrl) { fetch(cfg.searchHistoryUrl, { credentials: "same-origin" }) .then(function (r) { return r.json(); }) .then(function (res) { var items = res && Array.isArray(res.items) ? res.items : []; if (!items.length || !toolbar) return; var wrap = document.createElement("div"); wrap.className = "travelgo-upg-recent"; var title = document.createElement("strong"); title.textContent = (cfg.strings && cfg.strings.recentSearches) || "Recent searches"; title.style.marginRight = "8px"; wrap.appendChild(title); items.slice(0, 6).forEach(function (it) { var dep = it.depart_date || ""; var href = (cfg.resultsPageUrl || window.location.pathname) + "?tf_from=" + (it.route_from || "") + "&tf_to=" + (it.route_to || "") + "&tf_dep=" + dep + "&tf_trip=round_trip&tf_cur=INR"; var a = document.createElement("a"); a.className = "travelgo-upg-chip"; a.href = href; a.textContent = (it.route_from || "") + " → " + (it.route_to || ""); wrap.appendChild(a); }); toolbar.parentNode.insertBefore(wrap, toolbar); }); postJson(cfg.searchHistoryUrl, curStateFromUrl()); } if (featureOn("month_calendar") && cfg.monthFaresUrl) { var st = curStateFromUrl(); if (st.tf_from && st.tf_to && st.tf_dep) { var monthBox = q("#travelgo-fr-farecal-month", root); if (monthBox) { fetch(cfg.monthFaresUrl + "?tf_from=" + encodeURIComponent(st.tf_from) + "&tf_to=" + encodeURIComponent(st.tf_to) + "&tf_dep=" + encodeURIComponent(st.tf_dep), { credentials: "same-origin" }) .then(function (r) { return r.json(); }) .then(function (res) { var items = res && Array.isArray(res.items) ? res.items : []; if (!items.length) return; monthBox.innerHTML = "
Monthly fare trend
" + items.slice(0, 14).map(function (it) { return "" + it.date + " • ₹" + Number(it.price || 0).toLocaleString("en-IN") + ""; }).join(" "); }); } } } var compareData = []; function renderCompareDrawer() { var old = q(".travelgo-upg-compare"); if (old) old.remove(); if (!compareData.length) return; var d = document.createElement("div"); d.className = "travelgo-upg-compare"; d.innerHTML = "

Compare flights

"; document.body.appendChild(d); } if (featureOn("compare_drawer")) { root.addEventListener("click", function (e) { var card = e.target.closest(".travelgo-ss-flight-card"); if (!card) return; if (e.target.closest(".travelgo-upg-btn")) return; if (e.target.closest(".travelgo-ss-book-btn")) return; var t = q(".travelgo-ss-airline-name", card); var p = q(".travelgo-ss-price-amount", card); if (!t || !p) return; var row = (t.textContent || "").trim() + " — " + (p.textContent || "").trim(); if (compareData.indexOf(row) === -1) { compareData.push(row); } compareData = compareData.slice(-3); renderCompareDrawer(); track("compare_add"); }); } root.addEventListener("click", function (e) { var btn = e.target.closest(".travelgo-upg-btn"); if (!btn) return; var action = btn.getAttribute("data-upg"); var state = curStateFromUrl(); if (action === "save" && cfg.savedTripUrl) { postJson(cfg.savedTripUrl, state).then(function () { window.alert((cfg.strings && cfg.strings.tripSaved) || "Trip saved."); track("saved_trip_click"); }); } else if (action === "alert" && cfg.fareAlertUrl) { var target = window.prompt("Notify me when fare drops below (number)", "5000"); if (!target) return; state.target_price = Number(target) || 0; postJson(cfg.fareAlertUrl, state).then(function () { window.alert((cfg.strings && cfg.strings.alertCreated) || "Fare alert created."); track("fare_alert_click"); }); } else if (action === "compare-open") { renderCompareDrawer(); track("compare_open"); } }); if (featureOn("post_search_upsells")) { var list = q("#travelgo-ss-flight-list", root); if (list) { var up = document.createElement("div"); up.className = "travelgo-upg-upsell"; up.innerHTML = "Upgrade add-ons: Travel insurance, priority boarding, airport transfer, and hotel near destination."; list.parentNode.insertBefore(up, list); } } if (featureOn("ab_experiments")) { document.body.setAttribute("data-travelgo-ab-variant", upg.abVariant || "A"); } if (featureOn("localization_plus")) { var langSel = q("#travelgo-upg-lang-select", root); if (langSel) { var stored = window.localStorage.getItem("travelgo_lang") || "en"; langSel.value = stored; document.documentElement.setAttribute("lang", stored); langSel.addEventListener("change", function () { var v = langSel.value || "en"; window.localStorage.setItem("travelgo_lang", v); document.documentElement.setAttribute("lang", v); }); } } if (featureOn("abandonment_recovery") && cfg.abandonmentUrl) { var captured = false; window.addEventListener("beforeunload", function () { if (captured) return; captured = true; var payload = curStateFromUrl(); payload.resume_url = window.location.href; try { navigator.sendBeacon(cfg.abandonmentUrl, new Blob([JSON.stringify(payload)], { type: "application/json" })); } catch (e) {} }); } })();